# 窗口可伸缩模式
"""
窗口可变模式：
1、pygame.display.set_mode()
    要传入flags=pygame.RESIZABLE设置成可变模式
2、在监听事件的游戏循环中去监听pygame.VIDEORESIZE事件是否发生？
    如果发生了，就说明玩家更改了窗口大小。
    这时候就需要得到新的窗口大小：
        event.size[0]宽度（event.w）
        event.size[1]高度（event.h）
    将这两个值重写赋值给 size 变量
"""
# 导入必要库
import os
import sys
import pygame
# 初始化pygame
pygame.init()
# 定义各项变量
size = width, height = 1000, 600
speed = [1, 1]
WHITE = (255, 255, 255)
fps = 100
# 加载资源的路径设置
BASE_DIR = os.path.realpath(os.path.dirname(sys.argv[0]))
BALL_DIR = os.path.join(BASE_DIR, 'ball.gif')
MUSIC_DIR = os.path.join(BASE_DIR, 'music.mp3')
EN_DIR = os.path.join(BASE_DIR, 'en.mp3')
# 窗体初始化
screen = pygame.display.set_mode(size, flags=pygame.RESIZABLE)
pygame.display.set_caption('ball')
# 加载小球图片
ball = pygame.image.load(BALL_DIR)
ball_rect = ball.get_rect()
# 加载音乐
pygame.mixer.init()
pygame.mixer.music.load(MUSIC_DIR)
pygame.mixer.music.play()
# 生成时钟对象
clock = pygame.time.Clock()
# 游戏主体循环
while True:
    # 监听事件
    for event in pygame.event.get():
        # 当监听到退出事件时退出游戏
        if event.type == pygame.QUIT:
            sys.exit()
        # 当监听到修改窗口尺寸时，变换尺寸
        elif event.type == pygame.VIDEORESIZE:
            # print('窗口调整')
            # 接收到了更改窗口大小的事件后就需要对应去修改size尺寸
            size = width, height = event.size[0], event.size[1]
            # 重新设置窗口尺寸size后要重新传入set_mode()函数中生效
            screen = pygame.display.set_mode(size, pygame.RESIZABLE)
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                speed[0] -= 3
            elif event.key == pygame.K_RIGHT:
                speed[0] += 3
            elif event.key == pygame.K_UP:
                speed[1] -= 3
            elif event.key == pygame.K_DOWN:
                speed[1] += 3
            elif event.key == pygame.K_SPACE:
                speed[0] = 0
                speed[1] = 0
            # 此处的算法逻辑是
            # int(speed[0]/abs(speed[0])) 取出正负号
            # 5 * 1 = 5
            # 5 *-1 = -5
            if abs(speed[0]) > 5:
                speed[0] = 5 * int(speed[0]/abs(speed[0]))

            if abs(speed[1]) > 5:
                speed[1] = 5 * int(speed[1]/abs(speed[1]))

    ball_rect = ball_rect.move(speed[0], speed[1])
    if ball_rect.left < 0 or ball_rect.right > width:
        speed[0] = -speed[0]
        # Sound()函数，传入一个声音文件路径，生成一个声音对象
        # play()函数，传入一个声音对象，并进行播放
        pygame.mixer.Sound.play(pygame.mixer.Sound(EN_DIR))

    if ball_rect.top < 0 or ball_rect.bottom > height:
        speed[1] = -speed[1]
        pygame.mixer.Sound.play(pygame.mixer.Sound(EN_DIR))

    screen.fill(WHITE)
    screen.blit(ball, ball_rect)
    clock.tick(fps)
    pygame.display.update()
